// onjava/Sets.java
// (c)2021 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
package onjava;

import java.util.*;

/**
 * 
 * 泛型方法 -> Set实用工具：集合的数学运算
 *
 * @author Lucky Yang
 */
public class Sets {
  /**
   * 合集
   * 
   * @param <T>
   * @param a
   * @param b
   * @return
   */
  public static <T> Set<T> union(Set<T> a, Set<T> b) {
    Set<T> result = new HashSet<>(a);
    result.addAll(b);
    return result;
  }

  /**
   * 交集
   * 
   * @param <T>
   * @param a
   * @param b
   * @return
   */
  public static <T> Set<T> intersection(Set<T> a, Set<T> b) {
    Set<T> result = new HashSet<>(a);
    result.retainAll(b);
    return result;
  }

  /**
   * Subtract subset from superset:
   * 
   * 从超级中减去子集
   * 
   * @param <T>
   * @param superset
   * @param subset
   * @return
   */
  public static <T> Set<T> difference(Set<T> superset, Set<T> subset) {
    Set<T> result = new HashSet<>(superset);
    result.removeAll(subset);
    return result;
  }

  /**
   * Reflexive--everything not in the intersection:
   * 
   * 补集
   * 
   * @param <T>
   * @param a
   * @param b
   * @return
   */
  public static <T> Set<T> complement(Set<T> a, Set<T> b) {
    return difference(union(a, b), intersection(a, b));
  }
}
